"""
修复bcrypt库问题的脚本
创建时间：2025-09-21
作者：开发团队
目的：解决bcrypt库版本不兼容问题
"""

import sys
import os

# 添加项目路径
sys.path.append(os.path.join(os.path.dirname(__file__), 'backend', 'src'))

# 设置环境变量
os.environ['ENVIRONMENT'] = 'development'

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from backend.src.models.user import User
from backend.src.core.security import get_password_hash, verify_password
from backend.src.core.config import get_config

def fix_bcrypt_issue():
    """修复bcrypt库问题"""
    print("开始修复bcrypt库问题...")
    
    try:
        # 获取配置
        config = get_config()
        print(f"数据库URL: {config.DATABASE_URL}")
        
        # 创建数据库引擎
        engine = create_engine(config.DATABASE_URL, echo=False)
        
        # 创建会话
        SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
        db = SessionLocal()
        
        # 查询所有用户账户
        users = db.query(User).all()
        print(f"找到 {len(users)} 个用户账户")
        
        # 重新生成所有用户的密码哈希
        for user in users:
            print(f"\n处理用户: {user.username} (ID: {user.id}, 角色: {user.role})")
            
            # 使用当前bcrypt库重新生成密码哈希
            # 根据用户角色设置不同的默认密码
            user_role = str(user.role)
            if user_role == "guard":
                new_password = "123456"
            elif user_role == "admin":
                new_password = "admin123"
            elif user_role == "superadmin":
                new_password = "admin123"
            else:
                new_password = "123456"
            
            # 生成新的密码哈希
            new_hash = get_password_hash(new_password)
            setattr(user, 'password_hash', new_hash)
            
            # 测试新密码哈希
            is_valid = verify_password(new_password, new_hash)
            print(f"  新密码 '{new_password}' 验证结果: {is_valid}")
            
            # 更新数据库
            db.commit()
            print(f"  用户 {user.username} 的密码哈希已更新")
        
        db.close()
        print("\nbcrypt库问题修复完成")
        
    except Exception as e:
        print(f"修复过程中出现错误: {e}")
        import traceback
        traceback.print_exc()

def test_password_verification():
    """测试密码验证功能"""
    print("\n测试密码验证功能...")
    
    try:
        # 测试密码验证
        test_password = "123456"
        test_hash = get_password_hash(test_password)
        is_valid = verify_password(test_password, test_hash)
        print(f"密码 '{test_password}' 验证结果: {is_valid}")
        
        # 测试错误密码
        wrong_password = "wrongpassword"
        is_valid_wrong = verify_password(wrong_password, test_hash)
        print(f"错误密码 '{wrong_password}' 验证结果: {is_valid_wrong}")
        
    except Exception as e:
        print(f"密码验证测试出错: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    print("bcrypt库问题修复脚本")
    print("=" * 50)
    
    fix_bcrypt_issue()
    test_password_verification()
    
    print("\n修复脚本执行完成")